package terrforming.space;

import com.jogamp.opengl.util.Animator;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLJPanel;
import terrforming.space.graphics.OGLRenderer;
import terrforming.space.objects.Universe;

/**
 * Панель на которой выполняется отрисовка. Является измененной панелью JPanel
 * Функции: 
 *      -вызывает отрисовку (Renderer)
 *      -отслеживает события мыши
 */
public class MainGLJPanel extends GLJPanel{
    
    //размер области для отрисовки деленный пополам
    private float hfwidth, hfheight;
    
    //Universe
    Universe unvrs = Universe.getInstance();
    
    //компоненты Java OpenGL (JOGL)
    
    //рендерер
    private OGLRenderer rdr;
    //аниматор
    private Animator anim;
    
    public MainGLJPanel() {
        super();
        initVariables();
        rdr = new OGLRenderer();
        this.addGLEventListener((GLEventListener)rdr);
        anim = new Animator(this);
        anim.setRunAsFastAsPossible(false);
        anim.start();
        
        this.addMouseMotionListener(new MouseAdapter() {
           public void mouseDragged(MouseEvent evt){
               mouseDraggingHandler(evt);
           }
        });
        this.addMouseListener(new MouseAdapter() {
           public void mouseReleased(MouseEvent evt){
               mouseReleaseHandler(evt);
           }
        });
        this.addMouseListener(new MouseAdapter() {
           public void mousePressed(MouseEvent evt){
               mousePressedHandler(evt);
           }
        });
        this.addMouseWheelListener(new MouseAdapter() {
           public void mouseWheelMoved(MouseWheelEvent evt){
               mouseWheelMovedHandler(evt);
           }
        });
    }
    
    public final void initVariables(){
        hfwidth=1024/2;
        hfheight=768/2;
    }

    
     public void mouseDraggingHandler(MouseEvent evt){
         //1024 - левая кнопка мыши
         if (evt.getModifiersEx()==1024) {
            unvrs.getSglrt().setX((evt.getX()/hfwidth-1-rdr.dx)/rdr.zoom);
            unvrs.getSglrt().setY((1-evt.getY()/hfheight-rdr.dy)/rdr.zoom);
         }
         //1024 - клик на колесе 
         if (evt.getModifiersEx()==2048) {
             rdr.dx=evt.getX()/hfwidth-1;
             rdr.dy=1-evt.getY()/hfheight;
         }
    }
     
     public void mouseReleaseHandler(MouseEvent evt){
         if (evt.getButton()==MouseEvent.BUTTON1) {
             unvrs.getSglrt().deactivate();
             unvrs.getSglrt().planetCreatingUnlock();
         }
     }
     
     public void mouseWheelMovedHandler(MouseWheelEvent evt){
         rdr.zoom-=0.1*evt.getPreciseWheelRotation();
         if (rdr.zoom<0.1f) rdr.zoom=0.1f;
     }
     
     public void mousePressedHandler(MouseEvent evt){
         if (evt.getButton()==MouseEvent.BUTTON1) {
            unvrs.getSglrt().activate();
            unvrs.getSglrt().setX((evt.getX()/hfwidth-1-rdr.dx)/rdr.zoom);
            unvrs.getSglrt().setY((1-evt.getY()/hfheight-rdr.dy)/rdr.zoom);
         }
    }

    @Override
    protected void finalize() throws Throwable {
        anim.stop();
        super.finalize();
    }
    
}
